package design_mode.singleton;

public class singleton_1 {
    private singleton_1() {
    }

    // 声明为 volatile 的变量可以确保在多线程环境中，任何线程对这个变量的写入会立即对其他线程可见。（可见性，有序性）
    // 防止指令重排序，即 new Singleton() 之后，可能会出现instance变量在被其他线程读取时，尚未完成构造的情况
    private static volatile singleton_1 instance;

    // 在进入同步块之前，先检查实例是否为 null，这样可以避免每次调用 getInstance() 方法时都进行同步
    // 可能有多个线程同时进入同步块，此时只有第一个线程会创建实例
    public static singleton_1 getInstance() {
        if (instance == null) {
            synchronized (singleton_1.class) {
                if (instance == null) {
                    instance = new singleton_1();
                }
            }
        }
        return instance;
    }
}
